%%%===================================================================
%%% 日志
%%%===================================================================

-define(ECHO(Format),               catch sys_logger:echo(Format, [])).
-define(ECHO(Format, Args),         catch sys_logger:echo(Format, Args)).

-ifdef(debug).
-define(DEBUG(Format),              sys_logger:debug(Format, [], ?MODULE, ?LINE)).          % 调试日志
-define(DEBUG(Format, Args),        sys_logger:debug(Format, Args, ?MODULE, ?LINE)).        % 调试日志
-else.
-define(DEBUG(_Format),		        ok). % 忽略调试日志
-define(DEBUG(_Format, _Args),      ok). % 忽略调试日志
-endif.

-define(INFO(Format),               catch sys_logger:info(Format, [], ?MODULE, ?LINE)).     % 重要日志
-define(INFO(Format, Args),         catch sys_logger:info(Format, Args, ?MODULE, ?LINE)).   % 重要日志
-define(ERR(Format),                catch sys_logger:error(Format, [], ?MODULE, ?LINE)).    % 错误日志
-define(ERR(Format, Args),          catch sys_logger:error(Format, Args, ?MODULE, ?LINE)).  % 错误日志


%%%===================================================================
%%% 功能
%%%===================================================================

-define(IF(B, T, F),                case (B) of true -> (T); false -> (F) end).
-define(B(D),				        (util_type:to_binary(D))/binary).
-define(BS(D),				        (util_type:term_to_bitstring(D))/binary).
-define(RECORD_KV(Data, Record),    lists:zip(record_info(fields, Record), erlang:tl(erlang:tuple_to_list(Data)))).

%% 数字 Pos 位设为 1
-define(BIT_SET(Num, Pos),          Num bor (1 bsl (Pos - 1))).
%% 数字 Pos 位是否为 1
-define(BIT_CHECK(Num, Pos),        ((1 bsl (Pos - 1)) band Num) =/= 0).

-define(CALL(ServerRef, Request),
    case catch gen_server:call(ServerRef, Request) of
        {'EXIT', {timeout, _}} -> {error, timeout};
        {'EXIT', {noproc, _}} -> {error, noproc};
        {'EXIT', normal} -> {exit, normal};
        {'EXIT', Error} -> {error, Error};
        Rtn -> Rtn
    end).

-define(CALL2(ServerRef, Request),
    case catch gen_server:call(ServerRef, Request) of
        {'EXIT', Error} ->
            ?ERR("gen_server call error(~w)", [Error]),
            {error, server_busy};
        Rtn -> Rtn
    end).
